package com.hb.core.pojo.center.au.dto;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONUtil;
import com.hb.core.pojo.RoleDataAuthEntity;
import com.hb.core.pojo.center.au.entity.Org;
import com.hb.core.pojo.center.au.entity.User;
import lombok.Getter;
import lombok.Setter;

import java.util.List;
import java.util.Set;

/**
 * 用户数据传输对象
 *
 * @author zhaojk
 */
@Setter
@Getter
public class UserDTO extends User {
    /**
     * 数据权限查询条件
     */
    private RoleDataAuthEntity dataAuth;
    /**
     * 密码加盐的初始值
     */
    public static final String INIT_SALT_VALUE = "1";
    /**
     * 新增用户时的初始密码
     */
    public static final String INIT_PASSWORD = "123456";
    /**
     * 新增用户时的初始密码(密文)
     * 改密码必须与 INIT_PASSWORD 对应
     * 需要在hb-api模块中调用 org.fzzn.core.auth.shiro.util.CredentialUtil#md5(java.lang.String, '1')方法生成
     * 注意该类 CredentialUtil 只能在Api层调用
     * 用户密码的盐值默认为 1 (非常重要!!!!!!)
     */
    public static final String INIT_PASSWORD_SECRET = "5d4ab76d42320f1e5e5dec97268fbffe";
    /**
     * 用户信息的角色ID列表
     */
    private Set<Long> roleIds;
    /**
     * 用户信息的角色ID列表
     */
    private List<RoleDTO> roles;
    /**
     * 认证类型(1, CA, 2: 扫码, 3: 有其他的往后叠加)
     */
    private Integer verifyType;
    /**
     * 认证码, 唯一的认证信息, 为CA时则是CA的唯一序列号, 中招扫码时为机构交易码
     */
    private String verifyCode;
    /**
     * CA或者中招等第三方插件信息
     */
    private String backInfo;
    /**
     * 用户的部门信息
     */
    private OrgDeptDTO orgDept;

    /**
     * 用户的企业
     */
    private List<Org> orgList;

    /**
     * 用户扩展信息
     */
    private UserExtDTO userExt;

    /**
     * 企业名称
     */
    private String orgName;

    /**
     * 身份证号
     */
    private String cardNo;

    /**
     * 入库专业
     */
    private String savedMajor;

    /**
     * 1 企业架构的用户列表 查询当前企业已经子企业的用户列表
     * 2 只查询当前企业的用户列表
     */
    private Integer type;

    /**
     * 员工管理姓名和手机号
     */
    private String namePhoneCondition;

    /**
     * 业务角色类型
     *
     * @see com.hb.core.pojo.enums.RoleSignEnum
     */
    private Integer roleSign;

    /**
     * 新密码
     */
    private String newPassword;

    /**
     * 忘记密码时填写的手机号验证码
     */
    private String phoneCode;

    /**
     * 角色ID
     */
    private Long roleId;

    /**
     * 管理员用户已存在标志位（1:已存在，其他：不存在）
     */
    private Integer userExist;

    private String creditCode;

    /**
     * 参数验证
     *
     * @param fieldNames
     * @return
     */
    @Override
    public String paramsValid(String... fieldNames) {
        int length = StrUtil.length(getUsername());
        // 2022-4-29 用户名需要2-20
        if (2 > length || length > 20) {
            return "登录用户名的长度为4-20位";
        }
        length = StrUtil.length(getFullName());
        if (1 > length || length > 10) {
            return "姓名长度为1-10位";
        }
        if (StrUtil.isEmpty(getPhone())) {
            return "手机号码不能为空";
        }
/*        if (getDeptId() == null) {
            return "必须选择一个部门";
        }*/
        return null;
    }

    @Override
    public String toString() {
        return JSONUtil.toJsonStr(this, JSONConfig.create().setIgnoreNullValue(true));
    }

    /**
     * 合并角色查询参数
     *
     * @author zhaojk
     */
    public void mergeRoleIds() {
        if (roleId == null) {
            return;
        }
        if (roleIds == null) {
            roleIds = CollUtil.newHashSet();
        }
        roleIds.add(roleId);
    }
}
